Eleventy 全局数据
Eleventy 中包含一个 Global Data 模块,用于保存全局可访问的数据。可在模板中直接使用。
全局数据存放于 src/_data
目录下,支持多种类型的数据(JSON、JS、YAML)。
举例来说(《Lesson 7: Data basics | Learn Eleventy From Scratch》中的示例,在全局数据目录下,创建一个 site.json:
{
"name": "Issue 33",
"url": "https://issue33.com"
}
在模板/Patrials 中,例如 src/_includes/partials/site-head.html
(site-head.njk):
<a href="/" aria-label="{{ site.name }} - home" class="site-head__brand">
其中,site.name
,site 表示数据文件,name 表示其中的字段。
再来一个更复杂的案例,是导航栏的设计,首先创建导航路由的全局数据 navigation.json
:
{
"items": [
{
"text": "Home",
"url": "/"
},
{
"text": "About",
"url": "/about-us/"
},
]
}
在导航的 Partials 中:
<ul class="nav__list">
{% for item in navigation.items %}
<li>
<a href="{{ item.url }}">{{ item.text }}</a>
</li>
{% endfor %}
</ul>
结合 Nunjucks 的循环语法,使用起来很方便。
除了静态资源之外,还可以通过向全局数据中添加 JS 文件,实现全局方法,例如,下面创建了 helpers.js
,用于在导航栏中,进行高亮展示(注入 CSS 属性),helpers.js
:
module.exports = {
/**
* Returns back some attributes based on whether the
* link is active or a parent of an active item
*
* @param {String} itemUrl The link in question
* @param {String} pageUrl The page context
* @returns {String} The attributes or empty
*/
getLinkActiveState(itemUrl, pageUrl) {
let response = '';
if (itemUrl === pageUrl) {
response = ' aria-current="page"';
}
if (itemUrl.length > 1 && pageUrl.indexOf(itemUrl) === 0) {
response += ' data-state="active"';
}
return response;
}
};
修改 site-head.html
如下:
<ul class="nav__list">
{% for item in navigation.items %}
<li>
<a href="{{ item.url }}" {{ helpers.getLinkActiveState(item.url, page.url) | safe }}
>{{ item.text }}</a
>
</li>
{% endfor %}
</ul>
其中:page.url
是系统自带的属性,表示当前页面的 URL。关于 Page 的文档参见这里。
网络资源
本文作者:Maeiee
本文链接:Eleventy 全局数据
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!